import { insertCart, findCartList, deleteCart, updateCart, checkAllCart } from '@/api/cart'

const cart = {
  namespaced: true, // 开启命名空间
  state: () => ({
    cartList: [] // 购物车列表
  }),
  getters: {
    // 总钱数：把cartList中所有项的count * price 累加
    allPrice (state) {
      return state.cartList.reduce((a, c) => a + c.count * c.price, 0)
    },
    // 总件数: 把cartList中所有项的count累加
    allCount (state) {
      return state.cartList.reduce((a, c) => a + c.count, 0)
    },
    // 已选择：把cartList中所有selected为true的项筛选出来
    // 然后把筛选出来的数组中的每个count加起来
    selectedCount (state) {
      return state.cartList
        .filter(item => item.selected === true)
        .reduce((a, c) => a + c.count, 0)
    },
    // 已选择的商品总价钱:把cartList中所有selected为true的项筛选出来
    // 然后把筛选出来的数组中的每个price * count加起来
    selectedPrice (state) {
      return state.cartList
        .filter(item => item.selected === true)
        .reduce((a, c) => a + c.count * c.price, 0)
    },
    isAll (state) {
      return state.cartList.every((item) => item.selected)
    }
  },
  mutations: {
    setCartList (state, list) {
      state.cartList = list
    },
    // 单选修改状态
    singleCheck (state, { skuId, selected }) {
      // 1. 找到对应项 2.赋值操作
      // findIndex -> 下标值-> 找到某个项 然后删掉它(splice(index,1))
      // find -> item -> 找到某个项 然后修改它
      const item = state.cartList.find((item) => item.skuId === skuId) // Proxy
      item.selected = selected
    }
  },
  actions: {
    // 加入购物车
    async asyncInsert (ctx, { skuId, count }) {
      // 1. 加入购物车接口
      await insertCart({ skuId, count })
      // 2. 获取最新购物车列表接口
      const res = await findCartList()
      // 3. 把购物车列表存入state
      ctx.commit('setCartList', res.result)
    },
    // 删除购物车
    async asyncDelCart (ctx, ids) {
      // 1. 删除接口
      await deleteCart(ids)
      // 2. 获取最新购物车列表接口
      const res = await findCartList()
      // 3. 把购物车列表存入state
      ctx.commit('setCartList', res.result)
    },
    // 单选购物车
    async asyncSingleCheck (ctx, goods) {
      // 1. 调用单选业务接口
      await updateCart(goods)
      // 2. 获取最新购物车列表接口
      const res = await findCartList()
      // 3. 把购物车列表存入state
      ctx.commit('setCartList', res.result)
    },
    // 全选
    async asyncAllCheck (ctx, selected) {
      // 1.调用业务接口
      await checkAllCart({
        selected,
        ids: ctx.state.cartList.map(item => item.skuId)
      })
      // 2. 获取最新购物车列表接口
      const res = await findCartList()
      // 3. 把购物车列表存入state
      ctx.commit('setCartList', res.result)
    }
  }
}

export default cart
